
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js"><!--<![endif]-->
<head>
  <meta charset="utf-8">
  <title>
    
  version-control - LZH-DEV-TECH-SHARE
  

  </title>
  <meta name="author" content="">
  <meta name="description" content="">

  <meta name="HandheldFriendly" content="True">
  <meta name="MobileOptimized" content="320">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <link href="asset/css/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
  <link href="atom.xml" rel="alternate" title="LZH-DEV-TECH-SHARE" type="application/atom+xml">
  <script src="asset/js/modernizr-2.0.js"></script>
  <script src="asset/js/jquery.min.js"></script>
  <script src="asset/highlightjs/highlight.pack.js"></script>
  <link href="asset/highlightjs/styles/solarized_light.css" media="screen, projection" rel="stylesheet" type="text/css">
  <script>hljs.initHighlightingOnLoad();</script>

  <style type="text/css">
  .cat-children-p{ padding: 6px 0px;}
  .hljs{background: none;}
  </style>
  <script type="text/javascript">
  var isAddSildbar = true;
  </script>
  <script src="asset/js/octopress.js" type="text/javascript"></script>
</head>
<script type="text/javascript">
//链接新开窗口
function addBlankTargetForLinks () {
  $('a[href^="http"]').each(function(){
      $(this).attr('target', '_blank');
  });
}
$(document).ready(function(event) {
  addBlankTargetForLinks();
});
</script>
<body   >
  <header role="banner"><hgroup>
  <h1><a href="index.html">LZH-DEV-TECH-SHARE</a></h1>
  
    <h2></h2>
  
</hgroup>

</header>
  <nav role="navigation"><ul class="subscription" data-subscription="rss">
  <li><a href="atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
  
</ul>
  
<form action="http://google.com/search" method="get">
  <fieldset role="search">
    <input type="hidden" name="q" value="site:" />
    <input class="search" type="text" name="q" results="0" placeholder="Search"/>
  </fieldset>
</form>
  
<ul class="main-navigation">

  <li id=""><a target="self" href="index.html">Home</a></li>

  <li id=""><a target="_self" href="archives.html">Archives</a></li>

</ul>

</nav>
  <div id="main">
    <div id="content"> 
<div class="blog-index">

	<article>
		 <header>
		  	<h1 class="entry-title"><a href="15411425055347.html">LZH-DEV-GROUP Git Workflow 实践详解</a></h1>
			<p class="meta"><time datetime="2018-11-02T15:08:25+08:00" 
			pubdate data-updated="true">2018/11/2</time></p>
		 </header>
	  	<div class="entry-content">
		  	
		  	<h2 id="toc_0">名词解释</h2>

<ul>
<li>branch</li>
<li>tag</li>
<li>feature</li>
<li>feature-branch</li>
<li>release</li>
<li>release-branch</li>
<li>bug-fix</li>
<li>hot-fix</li>
<li>hot-fix-branch</li>
</ul>


		</div>

		

	</article>
 
	<article>
		 <header>
		  	<h1 class="entry-title"><a href="15403770118414.html">Git Workflow 工作指南</a></h1>
			<p class="meta"><time datetime="2018-10-24T18:30:11+08:00" 
			pubdate data-updated="true">2018/10/24</time></p>
		 </header>
	  	<div class="entry-content">
		  	
		  	<ul>
<li>
<a href="#toc_0">分支策略</a>
</li>
<li>
<a href="#toc_1">常用分支</a>
<ul>
<li>
<a href="#toc_2">master: 正式发布</a>
</li>
<li>
<a href="#toc_3">develop: 日常开发</a>
</li>
</ul>
</li>
<li>
<a href="#toc_4">临时分支</a>
<ul>
<li>
<a href="#toc_5">功能分支</a>
</li>
<li>
<a href="#toc_6">发布分支</a>
</li>
<li>
<a href="#toc_7">修补分支</a>
</li>
</ul>
</li>
<li>
<a href="#toc_8">Pull / Merge Request</a>
</li>
<li>
<a href="#toc_9">Code Review</a>
</li>
<li>
<a href="#toc_10">Git Command</a>
</li>
<li>
<a href="#toc_11">参考</a>
</li>
</ul>


<h2 id="toc_0">分支策略</h2>

<ul>
<li>代码库的常设分支始终只有 master 和 develop，临时分支最后都删除。</li>
<li>临时分支合并到常用分支时，必须发起 Pull / Merge Requset ，并指定一个人 code review。</li>
<li>远程临时分支由发起者追踪和维护， reviewer 负责删除。</li>
<li>所有的开发和迭代尽量都在临时分支上。</li>
<li>开发记录、功能集成、测试历史由 develop 分支管理，正式发布记录由 master 分支管理。</li>
<li>发布和部署时，必须新建发布分支。（发布分支基于 develop 分支）</li>
<li>发布和部署完成后，必须将发布分支合并回 develop / master 分支，然后删除发布分支。</li>
<li>合并到 master 分支的代码必须打上 Tag。（Tag：版本号、描述、日期）</li>
</ul>

<h2 id="toc_1">常用分支</h2>

<ul>
<li>master</li>
<li>develop</li>
</ul>

<h3 id="toc_2">master: 正式发布</h3>

<p>master 分支上存放的应该是随时可供在生产环境中部署的代码（Production Ready state）。当开发活动告一段落，产生了一份新的可供部署的代码时，master 分支上的代码会被更新。同时，每一次更新，需要添加对应的版本号标签（TAG）。</p>

<h3 id="toc_3">develop: 日常开发</h3>

<p>develop 分支是保存当前最新开发成果的分支。通常这个分支上的代码也是可进行每日夜间发布的代码（Nightly build）。因此这个分支有时也可以被称作“integration branch”。</p>

<h2 id="toc_4">临时分支</h2>

<ul>
<li>功能分支（feature）</li>
<li>发布分支（release）</li>
<li>修补分支（hotfix）</li>
</ul>

<h3 id="toc_5">功能分支</h3>

<p>功能分支，开发新功能都从 develop 分支出来，从 develop 分支上面分出来的。开发完成后，要再并入 develop。</p>

<pre><code class="language-shell"># 创建一个功能分支：
git checkout -b feature-x develop

# 开发完成后，将功能分支合并到develop分支：
git checkout develop
git merge --no-ff feature-x

# 删除feature 分支：
git branch -d feature-x
</code></pre>

<h3 id="toc_6">发布分支</h3>

<p>发布分支，准备要 release 的版本，只修 bugs。从 develop 分支上面分出来，发布结束以后，必须合并进 develop 和 master 分支。</p>

<pre><code class="language-shell"># 创建一个发布分支：
git checkout -b release-1.2 develop

# 确认没有问题后，合并到master分支：
git checkout master
git merge --no-ff release-1.2

# 对合并生成的新节点，做一个标签
git tag -a 1.2

# 再合并到develop分支：
git checkout develop
git merge --no-ff release-1.2

# 最后，删除发布分支：
git branch -d release-1.2
</code></pre>

<h3 id="toc_7">修补分支</h3>

<p>修补分支，是指等不及 release 版本就必须马上修 master 赶上线的情况。它是从 master 分支上面分出来的。修补结束以后， 再合并进 master 和 develop 分支。</p>

<pre><code class="language-shell"># 创建一个修补bug分支：
git checkout -b hotfix-0.1 master

# 修补结束后，合并到master分支：
git checkout master
git merge --no-ff hotfix-0.1
git tag -a 0.1.1

# 再合并到develop分支：
git checkout develop
git merge --no-ff hotfix-0.1

# 最后，删除&quot;修补bug分支&quot;：
git branch -d hotfix-0.1
</code></pre>

<h2 id="toc_8">Pull / Merge Request</h2>

<p>代码合并到 master/develop 分支：</p>

<ol>
<li>将需要合并到 master / develop 的分支 push 到 gitlab。</li>
<li>进入工程 -&gt; merge request -&gt; create new merge request 。</li>
<li>选择源分支、目标分支，确定。</li>
<li>review 负责人进入 merge request，确认没有问题之后选择 Auto Merge（或者手动在本地合并之后再 push 到 gitlab），并关闭这个 merge request，完成。</li>
<li>如果发现问题那么在有问题的行下注释，并提醒 request 的发起人及时修改。</li>
<li>删除本地临时分支，本地 master / develop 更新到最新状态。</li>
</ol>

<h2 id="toc_9">Code Review</h2>

<ul>
<li>提交 Pull / Merge Request 时， Commit 和 Message 要足够清晰详细。 切记，如果一次提交的内容包含很多 Commit，请不要使用自动生成的描述。 请用简短且足够说明问题的语言（理想是控制在3句话之内）来描述：</li>
</ul>

<blockquote>
<p>你改动了什么，解决了什么问题，需要代码审查的人留意那些影响比较大的改动。特别需要留意，如果对基础、公共的组件进行了改动，一定要另起一行特别说明。</p>
</blockquote>

<ul>
<li>审核人员邀请原则：项目参与人员 &amp; 团队同事 &amp; 团队 Leader。（对项目足够了解，对项目足够了解，对项目足够了解，重要的事情说三遍）；</li>
<li>评论中至少出现一个 lgtm 且保证代码评审通过之后 Pull / Merge Request 才可以被合并；（注：lgtm 即 looks good to me 的缩写）</li>
</ul>

<h2 id="toc_10">Git Command</h2>

<pre><code class="language-shell">git tag
# 创建一个带版本有描述的 tag
git tag -a v0.1.0 -m &#39;commit&#39;
# 覆盖该版本已有 v0.1.0 
git tag -f v0.1.0 
# 推送服务器
git push origin --tags
# 服务器已有 v0.1.0，强制推到服务器
git push origin -f v0.1.0 
# 服务器获取刚刚的 v0.1.0
git fetch --tag
# 删除本地版本
git tag -d v0.1.0
# 删除服务器上的tag
git push origin :v0.1.0
git merge

# 不使用 fast-forward 方式合并，保留分支的 commit 历史
git merge --no-ff develop
# 使用 squash 方式合并，把多次分支commit历史压缩为一次
git merge --squash develop
git checkout

# 放弃在 file.txt 的修改，恢复成未修改时的样子
git checkout file.txt
# 当前目录所有修改的文件，恢复成未修改时的样子
git checkout .
# 创建新的分支，并切换过去
git checkout -b branchname
git reset

# 回退指定的 commit 
git reset 0c5602affd27d2224d151284bd1c6e033fd9023f
# 回退上次修改
git reset --hard
git flow

# git flow 初始化
git flow init
# 创建一个新的 feature 分支
git flow feature start name
# 将 feature 分支推送到远程仓库
git flow feature publish name
# 当特性开发完毕，需要将此分支合并到 develop 分支
git flow feature finish name
</code></pre>

<h2 id="toc_11">参考</h2>

<ol>
<li><a href="https://segmentfault.com/http://www.ruanyifeng.com/blog/2012/07/git.html/">Git分支管理策略</a></li>
<li><a href="https://segmentfault.com/http://www.15yan.com/topic/yi-dong-kai-fa-na-dian-shi/6yueHxcgD9Z/">GitLab Flow的使用</a></li>
<li><a href="https://segmentfault.com/https://blog.zengrong.net/post/1746.html/">Git查看、删除、重命名远程分支和tag</a></li>
<li><a href="https://segmentfault.com/http://blog.jobbole.com/76867/">Git工作流指南：Gitflow工作流</a></li>
<li><a href="Git%20%E5%9C%A8%E5%9B%A2%E9%98%9F%E4%B8%AD%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5--%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8Git%20Flow">Git 在团队中的最佳实践--如何正确使用Git Flow</a></li>
</ol>


		</div>

		

	</article>
  
	<div class="pagination">
	
<a href="archives.html">Blog Archives</a>
	 
	    
	</div>
</div>
 <aside class="sidebar"> 

	<section>
	  <h1>Categories</h1>
	  <ul id="recent_posts">
	  
	      <li class="post">
	        <a href="version-control.html"><strong>version-control&nbsp;(2)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="shell.html"><strong>shell&nbsp;(1)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="back-end.html"><strong>back-end&nbsp;(4)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="front-end.html"><strong>front-end&nbsp;(5)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="version-control-1.html"><strong>version-control&nbsp;(1)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="other.html"><strong>other&nbsp;(2)</strong></a>
	        
	        
	        
	      </li>
	   
	  </ul>
	</section>
	<section>
	  <h1>Recent Posts</h1>
	  <ul id="recent_posts">
	  
	      
		      <li class="post">
		        <a href="15413898294420.html">RESTful API 最佳实践</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15411425055347.html">LZH-DEV-GROUP Git Workflow 实践详解</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15410718240579.html">如何使用PM2进程管理器, 守护java进程</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15408811446857.html">一篇文章搞定 centos7 上的 mysql 安装</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15408703788547.html">一篇文章搞定 centos7 下安装 nvm和node</a>
		      </li>
	     
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	   
	  </ul>
	</section>
	
</aside> </div></div>
  <footer role="contentinfo"><p>
  Copyright &copy; 2014 -  -
  <span class="credit">Powered by <a target="_blank" href="http://www.mweb.im">MWeb</a> &nbsp;&nbsp; Theme by <a href="http://octopress.org">Octopress</a></span>
</p>

</footer>

  
    




</body>
</html>